iT邦幫忙

2025 iThome 鐵人賽

DAY 17
0
Software Development

Python 小白的逆襲:30 天從零到能教人的精華筆記,寫給迷惘的你與當年的我自己!系列 第 17

【Day17】集合型態第三彈:Set集合-去重、比對、集合運算都靠它

  • 分享至 

  • xImage
  •  

前言

嗨囉!時間真的過的很快~一下就已經來到Day17了!

昨天我們認識了 Tuple(元組),知道了「固定不動、不可修改」的資料容器,
也有做一些List和Tuple的比較,相信讀者們已經掌握住重點了~

今天,我們要介紹集合型態的另一位成員:Set(集合)
它和 List / Tuple 又有不同特色!ㄧ起來看看吧!

一、Set 是什麼?{ }

  • Set 可以想像成 「不重複元素的集合」
  • 元素 沒有順序,所以不能用索引取值(很重要!新手常忽略的點)
  • 自動去重,遇到重複元素會自動刪掉

範例:


my_set = {1, 2, 3, 3, 2}
print(my_set)  # {1, 2, 3}
print(type(my_set))  # <class 'set'>

輸出:

{1, 2, 3}
<class 'set'>

小提醒:

  • 重複元素會自動去掉
  • Set 沒有順序 → 無法用 [0] 取值

二、為什麼需要 Set?

  1. 去重:List 中有重複值,用 Set 直接去掉
  2. 快速檢查元素是否存在:Set 查找速度比 List 快很多
  3. 集合運算:交集、聯集、差集操作比 List 直覺
  4. 不關心順序:只要知道「有哪些元素」,不必排序

三、Set 與 List / Tuple 的比較

特性 List Tuple Set
是否可修改 不可 可新增/刪除元素
是否有順序
是否允許重複 不允許
語法 [] () {}
常見用途 動態清單、任務清單 固定資料、設定值、字典 key 去重、快速查詢、集合運算
遍歷方式 for for for(無順序)

四、Set 的基本操作

  1. 新增元素add()
s = {1, 2, 3}
s.add(4)
print(s)  

輸出:

{1,2,3,4}
  1. 刪除元素remove() / discard()
s = {1, 2, 3}
s.remove(2)   # 2 不存在會報錯
s.discard(5)  # 5 不存在也沒事
print(s)  # {1,3}

輸出:

{1,3}

如果寫成 (5) → Python 會當作數字,不是 tuple!

3.清空集合clear()

s.clear()
print(s)  # set()

輸出:

set()

4.長度與成員檢查

s = {1, 2, 3}
print(len(s))   # 3
print(2 in s)   # True
print(5 in s)   # False

輸出:

3
True
False

Set 的基本操作(生活化範例:喜歡的水果)

上面的基本操作範例是不是有點陽春呢?(無趣)
接下來我會用比較日常的例子去解釋上面提到的操作!一起來看看吧~

1️⃣ 建立集合

fruits = {"蘋果", "香蕉", "橘子"}
print(fruits)

輸出:

https://ithelp.ithome.com.tw/upload/images/20251001/201647210VAdgtbIE1.png

有發現嗎?輸出沒有特別「按照」順序喔!
這也是Set的特點之一。

  • 說明:用 {} 建立集合,元素會自動去重(不會有重複水果)。
  • 生活化解釋:你列出喜歡的水果清單,不會重複計算同一種水果。

2️⃣ 新增元素 add()

# Alice 想增加喜歡的水果

fruits.add("西瓜")
print(fruits)

輸出:

https://ithelp.ithome.com.tw/upload/images/20251001/20164721lbSjXNp1AG.png

  • 說明:新增一個元素到集合中,如果已存在,集合不會重複。
  • 生活化解釋:你把新水果加入喜歡的清單,重複的水果不會出現兩次。

3️⃣ 移除元素 remove() / discard()

# Alice 不喜歡香蕉了
fruits.remove("香蕉")
print(fruits)

# discard 不會報錯
fruits.discard("芒果")  # 集合中沒有芒果也不會出錯

輸出:

https://ithelp.ithome.com.tw/upload/images/20251001/20164721eaE3f2WlQY.png

五、進階操作:集合運算

這邊整理一下集合的運算符號!可以對照白話文的解說對著看會比較容易一些~

  • 聯集 | → 「把兩個集合的元素都列出」
  • 交集 & → 「找出兩個集合都有的元素」
  • 差集- → 「找出第一個集合有但第二個沒有的元素」
  • 對稱差 ^ → 「找出兩個集合中不重複的元素」

1.集合運算

a = {1, 2, 3, 4}
b = {3, 4, 5, 6}

print("聯集 a|b:", a | b)   
print("交集 a&b:", a & b)   
print("差集 a-b:", a - b)  
print("對稱差 a^b:", a ^ b) 

輸出:
https://ithelp.ithome.com.tw/upload/images/20251001/20164721shbKt66i4c.png

這邊看一下比較生活化的範例:

Saturday_activities = {"跑步", "游泳", "看書"}
Sunday_activities = {"游泳", "看電影", "看書"}

# 聯集 → 週末活動總集
print("週末總活動:", Saturday_activities | Sunday_activities)

# 交集 → 兩天都想做的活動
print("週末兩天都想做的活動:",  Saturday_activities & Sunday_activities

# 差集 → 只想在星期六做的活動
print("星期六專屬活動:",  Saturday_activities - Sunday_activities)

輸出:
https://ithelp.ithome.com.tw/upload/images/20251001/20164721JnfySyrEYl.png

2.延續上面提到的水果例子,我們也用集合運算去玩玩看~

(1)聯集 | / union()

# Alice 和 Bob 喜歡的水果
alice = {"蘋果", "香蕉", "橘子"}
bob = {"香蕉", "西瓜", "芒果"}

# 聯集:兩人喜歡的所有水果
all_fruits = alice | bob
print(all_fruits)

輸出:(列出兩個人的水果清單,所有不重複的水果都列出來)
https://ithelp.ithome.com.tw/upload/images/20251001/20164721EQs2TBGvYk.png

(2) 交集 & / intersection()

# 交集:兩人都喜歡的水果
common_fruits = alice & bob
print(common_fruits)

輸出:(找出兩人都喜歡的水果,就是「共同喜好」)
https://ithelp.ithome.com.tw/upload/images/20251001/20164721VXU9onOHF2.png

(3)差集 - / difference()

# Alice 喜歡但 Bob 不喜歡的水果
unique_alice = alice - bob
print(unique_alice)

輸出:(Alice 喜歡但 Bob 不喜歡的水果)

https://ithelp.ithome.com.tw/upload/images/20251001/20164721Q8wHs2fLcq.png

(4)對稱差集 ^ / symmetric_difference()

# 兩人喜歡但不重複的水果

diff_fruits = alice ^ bob
print(diff_fruits)

輸出:
https://ithelp.ithome.com.tw/upload/images/20251001/20164721hxulpg7ZUY.png

(5)查詢元素是否存在(輸出會是布林值)

# Alice 是否喜歡蘋果?
print("蘋果" in alice)  
print("西瓜" in alice)   # False

輸出:

https://ithelp.ithome.com.tw/upload/images/20251001/20164721Xg03vCnHyV.png

六、實戰演練+解析:選課系統

情境:學生選課,每個學生最多 3 門,不能選重複課程。

這邊先看一下完整的程式碼:

students = ["Alice", "Bob", "Charlie"]
courses = ["Python", "C", "Java", "HTML", "CSS"]

registrations = {}

for student in students:
    selected = set()
    print(f"\n{student} 選課開始!")
    while len(selected) < 3:
        print("可選課程:", courses)
        choice = input("輸入課程名稱 (輸入 '結束' 完成):")
        if choice == "結束":
            if len(selected) >= 1:
                break
            else:
                print("⚠️ 至少要選一門課")
                continue
        if choice not in courses:
            print("⚠️ 無效課程")
            continue
        if choice in selected:
            print("⚠️ 已選過此課程")
            continue
        selected.add(choice)
        print(f"✅ 選擇 {choice}")

    registrations[student] = selected

print("\n📋 選課結果:")
for student, selected in registrations.items():
    print(f"{student}: {selected}")

完整輸出:
https://ithelp.ithome.com.tw/upload/images/20251001/20164721cNu2Ux61MZ.png

學習重點

  • Set 自動去重 + 限制最大長度。
  • while 條件控制 + continue 錯誤處理。
  • 結合之前學過的 List、if-else、for-loop

延伸討論(續上題):

  1. 聯集 (union) → 適合統計所有學生的熱門課程有哪些。
  2. 交集 (intersection) → 適合找出大家都選的必修課或共通課程。
  3. 差集 (difference) → 可以找出每個學生的個人化課程或漏選課程。
  4. 對稱差集 (symmetric_difference) → 找出兩人選課完全不重疊的部分。
#  所有學生選課的總集合(聯集)
all_courses = set()
for selected in registrations.values():
    all_courses |= selected  # 等同 all_courses = all_courses.union(selected)
print("所有學生選過的課程(聯集):", all_courses)

#  找出所有學生都選的課程(交集)
common_courses = set(courses)  # 初始設為全部課程
for selected in registrations.values():
    common_courses &= selected  # 交集
print(" 所有學生都選的課程(交集):", common_courses)

#  找出 Alice 選但 Bob 沒選的課程(差集)
alice_courses = registrations["Alice"]
bob_courses = registrations["Bob"]
alice_not_bob = alice_courses - bob_courses
print(" Alice 選但 Bob 沒選的課程(差集):", alice_not_bob)

#  找出 Bob 選但 Alice 沒選的課程
bob_not_alice = bob_courses - alice_courses
print(" Bob 選但 Alice 沒選的課程(差集):", bob_not_alice)

#  兩人選課的交集(共同課程)
alice_bob_common = alice_courses & bob_courses
print(" Alice 與 Bob 的共同課程:", alice_bob_common)

輸出:

https://ithelp.ithome.com.tw/upload/images/20251001/20164721LUqKKLT5zv.png

今日結語

今天我們認識了 集合型態家族的新成員:Set(集合)

它跟 List、Tuple 都有點像,但又很不一樣:

  • Set 不允許重複元素,所以可以很方便幫你「去掉重複」。
  • Set 沒有順序,不像 List 可以用索引取值,這讓它更適合做運算和比對。

我們也比對了目前教過的三種集合型態!

特性 List Tuple Set
可否修改 可以 不行 可以(新增/刪除)
元素可否重複 可以 可以 不行
是否有順序 沒有
適合用途 任務清單、動態資料 固定資料、設定值、字典 key 去重、比對、集合運算

今天我們也做了有關於set的實戰練習:

  1. 學生選課系統
    • 每個學生選的課程用 set 存,避免重複選課
    • 用 while、if-else 控制選課流程
  2. 集合運算聯集、交集、差集
    • 輕鬆算出「所有學生選過的課程」「大家都選的課程」「誰選了但別人沒選的課程」
    • 完全不用自己一個一個比對

有感覺嗎?
Set 就像是一個「隨手去重的小幫手」,
適合用在比對、統計或過濾資料時,比 List 或 Tuple 更省事。

如果對於今天的內容有疑惑,歡迎在底下留言呦!

那麼,今天也辛苦啦!!我們明天見喔~


上一篇
【Day16】集合型態第二彈:Tuple 元組 ─ 不可動如山!
下一篇
【Day18】集合型態壓軸登場:Dictionary 字典
系列文
Python 小白的逆襲:30 天從零到能教人的精華筆記,寫給迷惘的你與當年的我自己!24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言